package com.cskaoyan.javase.oop3._2inner._1member._0introduction;

import org.omg.CORBA.INTF_REPOS;

/**
 * 要了解成员内部的的成员特点之前,先明确两点:
 *      1.成员内部类可以近似的看成一个外围类成员,这是因为成员内部类对象一定会持有外围类对象的引用
 *          这导致,成员内部类对象会依赖于外围类对象而存在
 *          必须先存着外围类对象,才能得到成员内部类对象
 *
 *     2.类加载,很明显成员内部类对象依赖于外围类对象,所以类加载的顺序,应该是先外围类,再内部类
 *          而且正是由于成员内部类对象依赖于外围类对象而存在
 *          所以成员内部类当中没有static声明.
 *          关于成员内部类中没有静态声明，至少可以有以下几个理由：
 *              1.成员内部类被设计成依赖外围类而存在，如果一个非静态内部类有了静态成员，静态成员不依托于任何内部类实例，就破坏了这种设计的目的。
 *              2.没有必要。静态成员的目的是脱离对象而使用一个变量或者方法，完全可以将它们定义到外围类中，然后去使用。
 *              3.也可以从代码角度上考虑,如果成员内部类存在静态成员,那就可以在静态成员中创建自身对象,这是不合理的.
 *
 * 成员内部类是一种基础,比较常见的内部,它指的是定义在某个类成员位置的内部类
 * 它的语法:
 *      //外围类
 *      [访问权限修饰符] class EnclosedClazz{
 *          //成员内部类
 *          [访问权限修饰符] class InnerClazz{
 *           }
 *      }
 *
 * 成员内部类可以直接看成外围类的一个普通成员.
 * 成员内部类的基本特点:
 * 主要从以下几个角度分析：
 *      1.访问权限修饰符
 *          四种访问级别皆可用.
 *          可以近似的把它看成外围类的一个成员
 *          注:
 *              1.要想在外部访问成员内部类成员,首先得需要外围类的权限,其次还需要成员内部类的权限
 *              2.既然是定义内部类,那么访问权限多数都是私有的.
 *
 *      2.成员特点
 *          是没有静态声明,没有静态成员变量,没有静态成员方法,也没有静态代码块
 *          其他的和普通类一样.
 *
 *          注意:
 *          当然全局常量是可以定义的,只能定义那些访问不会触发类加载的全局常量.(字面值常量赋值的)
 *
 *      3.继承和实现
 *          可以继承,可以实现
 *          既可以继承内部的类和接口
 *          也可以继承外部的类和接口
 *
 * @since 10:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}
// 定义外围类
class EnclosedClazz{

    abstract class BaseA{}
    interface IA{}

    // 定义成员内部类
    private class InnerClazz{
        // static final InnerClazz ic = new InnerClazz();
        int a;
        private int b = 10;
        // static int c = 30;
        static final int D = 100;
        static final String str = "123";
        // static final String str2 = new String();

        public void test(){}

        public InnerClazz(int a, int b) {
            this.a = a;
            this.b = b;
        }

        public InnerClazz() {
        }

        // 构造代码块
        {}
    }
}
